﻿using AutoMapper;
using DailyApp.WebAPI.ApiResponses;
using DailyApp.WebAPI.DataModel;
using DailyApp.WebAPI.DTOs;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace DailyApp.WebAPI.Controllers
{
    /// <summary>
    /// 负责账户的API
    /// 一定要修改路由，让路由指向动作
    /// </summary>
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class AccountController : ControllerBase
    {
        /// <summary>
        /// 数据库上下文
        /// </summary>
        private readonly DailyAppDbContext db;

        private readonly IMapper mapper;

        public AccountController(DailyAppDbContext _db, IMapper _mapper)
        {
            //通过构造函数取出依赖注入的数据库上下文
            db = _db;
            mapper = _mapper;
        }


        /// <summary>
        /// 用户注册
        /// </summary>
        /// <param name="accountInfoDTO">用户信息</param>
        /// <returns>注册结果信息</returns>
        [HttpPost]
        public IActionResult Registered(AccountInfoDTO accountInfoDTO)
        {
            //响应的数据，用于返回结果..
            var res = new ApiResponse();


            //业务
            try
            {
                //1.账号是否已经存在(这里没考虑到高并发)
                var dbAccountResult = db.AccountInfo.Where(t => t.Account == accountInfoDTO.Account).FirstOrDefault();//查询第一条数据是否为空
                if (dbAccountResult != null)
                {
                    res.ResultCode = -1;//账号已存在
                    res.ResultMsg = "账号已经注册!";
                    return Ok(res);
                }

                //2.没查到，没重复，那就添加数据，添加数据需要改变ef模型下的数据表的数据
                //***此处通过第三方组件automapper解决DTO->Model(针对数据量极大地情况)
                if (dbAccountResult == null)
                {
                    ////添加数据(比较笨的方法,直接使用初始化器)
                    //var accountInfo = new AccountInfo()
                    //{
                    //    Name = accountInfoDTO.Name,
                    //    Account = accountInfoDTO.Account,
                    //    Password = accountInfoDTO.Password
                    //};

                    //使用automapper
                    var accountInfo = mapper.Map<AccountInfo>(accountInfoDTO);

                    //添加到数据库
                    db.AccountInfo.Add(accountInfo);
                    var count = db.SaveChanges();//返回值为受影响的行数

                    if (count == 1)
                    {
                        res.ResultCode = 1;
                        res.ResultMsg = "账号注册成功！";
                    }
                    else
                    {

                        res.ResultCode = 0;
                        res.ResultMsg = "服务器出现异常！";
                    }
                }
            }
            catch (Exception)
            {

                res.ResultCode = -99;
                res.ResultMsg = "服务器出现异常！";
            }
            return Ok(res);
        }


        /// <summary>
        /// 登陆
        /// </summary>
        /// <param name="account">账户</param>
        /// <param name="pwd">密码(Md5值)</param>
        /// <returns>该账户的信息</returns>
        [HttpGet]//public IActionResult Login(AccountInfoDTO accountInfoDTO) error--get方法不能包含请求体(Dto模型就是),只能通过字符串查询.
        public IActionResult Login(string account, string pwd)
        {
            var res = new ApiResponse();

            try
            {
                //使用linq查询与之匹配的那一条数据数据
                var dbAccountInfo = db.AccountInfo.Where(t => t.Account == account).FirstOrDefault();

                //主业务
                if (dbAccountInfo == null)//账号不存在
                {
                    res.ResultCode = -1;
                    res.ResultMsg = "账号不存在!";
                    return Ok(res);

                }

                if (dbAccountInfo.Password != pwd)
                {
                    res.ResultCode = 0;
                    res.ResultMsg = "密码错误！";
                    return Ok(res);
                }

                //成功
                res.ResultCode = 1;
                res.ResultMsg = "登陆成功！";
                res.ResultData = dbAccountInfo;

            }
            catch (Exception)
            {

                res.ResultCode = -99;
                res.ResultMsg = "服务器忙...";
            }
            return Ok(res);
        }
    }
}
